<?php
//рус
abstract class active_module_class
{
    /**
		протокол, по которому будет работать модуль
     */
    private $_protocol;
    /**
		окружение, в котором будет работать модуль
     */
    private $_env;
    private $_id = 0;
    private $_title = '';
    private $_name;
    private $_path;
    private $_folder;
    private $_decorator;
    private $_request;
    private $_response;
    private $_ctrls;
    private $_moduleCollection;
    private $_user;
    
    final public function __construct ($name, active_user_class $user = null)
    {
    	MozgLang::Load('module_' .$name);
    	
    	$classNameParts = explode('_', get_class($this));
    	$envName = '_'. array_pop($classNameParts);
    	$protName = array_pop($classNameParts);
    	
        $this->_moduleCollection = SysLoader::GetModuleCollection();
        $details = $this->_moduleCollection->GetModuleDetails($name);
        $this->SetProtEnv($protName, $envName)
             ->SetUser($user)
             ->SetName($name)
             ->SetId($details['id'])
             ->SetTitle($details['title'])
             ->SetPath($this->_moduleCollection->GetModulePath($name))
             ->SetFolder($this->_moduleCollection->GetModuleFolder($name));

		$this->Init();             
    }
    /**
		устанавливает протокол и окружение,
		вызывается только в конструкторе
     */
    final private function SetProtEnv ($protName, $envName)
    {
        if (! SysLoader::IsRightProt($protName))
            throw new Exception('Неправильный протокол');
        $this->_protocol = $protName;
        if (! SysLoader::IsRightEnv($protName, $envName))
            throw new Exception('Неправильное окружение');
        $this->_env = $envName;
        return $this;
    }
    /**
		возвращает протокол, если установлен
     */
    final public function GetProt ()
    {
        if (! $this->_protocol)
            throw new Exception('Протокол для модуля не установлен');
        return $this->_protocol;
    }
    /**
		возвращает окружение, если установлено
     */
    final public function GetEnv ()
    {
        return $this->_env;
    }
    
    final private function SetName ($name)
    {
        $this->_name = $name;
        return $this;
    }
    
    final public function GetName ()
    {
        return $this->_name;
    }
    
    final private function SetTitle ($title)
    {
        $this->_title = $title;
        return $this;
    }
    
    final public function GetTitle ()
    {
        return $this->_title;
    }
    
    final private function SetId ($id)
    {
        $this->_id = $id;
        return $this;
    }
    
    final public function GetId ()
    {
        return $this->_id;
    }
    
    final private function SetFolder ($folder)
    {
        $this->_folder = $folder;
        return $this;
    }
    
    final public function GetFolder ()
    {
        return $this->_folder;
    }
    
    final private function SetPath ($path)
    {
        $this->_path = $path;
        return $this;
    }
    
    final public function GetPath ()
    {
        if (! $this->_path || ! is_dir($this->_path))
            throw new Exception('Путь для модуля ' . $this->_title . ' не установлен или не существует');
        return $this->_path;
    }
    
    /**
		Инициализация модуля
     */
    public function Init ()
    {

    }
    
    public function CheckAccessWithUserGranted(controller_prototype_class $ctrlObj, $basicActionName)
    {
		return $ctrlObj->CheckAccessWithUserGranted($basicActionName);     	
    }
    
    /**
		объект запроса для модуля
     */
    public function GetRequest ()
    {
        if (! ($this->_request instanceof request_prototype_class))
            $this->_request = SysLoader::GetRequest($this->GetProt());
        return $this->_request;
    }
    
    /**
		объект ответа для модуля
     */
    public function GetResponse ()
    {
        if (! ($this->_response instanceof response_prototype_class))
            $this->_response = SysLoader::GetResponse($this->GetProt());
        return $this->_response;
    }
    
    final public function IsCtrlExists ($ctrlName)
    {
        return SysLoader::IsCtrlExists($this->GetName(), $ctrlName, $this->GetProt(), $this->GetEnv());
    }
    
    /**
		возвращает данные контроллера по его имени
     */
    final public function GetCtrlDetails ($ctrlName)
    {
        return $this->_moduleCollection->GetCtrlDetails($this->GetName(), $ctrlName);
    }
    
    final public function GetCtrlPath ($ctrlName)
    {
        return SysLoader::GetCtrlPath($this->GetName(), $ctrlName);
    }
    /**
		возвращает коллекцию объектов контроллеров
     */
    final public function GetCtrlCollection ()
    {
        if (! ($this->_ctrls instanceof ctrls_collection_class))
            $this->_ctrls = SysLoader::GetCtrlCollection($this);
        return $this->_ctrls;
    }
    /**
		возвращает новый объект контроллера(не из коллекции)
     */
    final public function GetCtrl ($ctrlName, $modObj = null)
    {
        return SysLoader::GetCtrl($ctrlName, $this, $modObj);
    }

    /**
		возвращает коллекцию объектов моделей (обёртка)
     */
    final public function GetModCollection ()
    {
        return SysLoader::GetModCollection();
    }
    
    /**
		возвращает коллекцию объектов библиотек (обёртка)
     */
    final public function GetLibCollection ()
    {
        return SysLoader::GetLibCollection();
    }
    
    /**
		список экшенов для контроллера
     */
    final public function GetCtrlActionList ($ctrlName)
    {
        return $this->_moduleCollection->GetCtrlActionList($this->GetName(), $ctrlName);
    }

	/**
	 * авторизация юзера
	 * 
	 */
    public function Auth()
    {
        return $this;
    }
    /**
		возвращает объект активного юзера
     */
    public function SetUser (active_user_class $user = null)
    {
        if (! is_null($user))
            $this->_user = $user;
        else
            $this->_user = SysLoader::GetUser();
        return $this;
    }
    /**
		возвращает объект юзера
     */
    public function GetUser ()
    {
        if (! ($this->_user instanceof active_user_class))
            $this->SetUser();
        return $this->_user;
    }
    /**
		декоратор
     */
    public function GetDecorator ()
    {
        if (! ($this->_decorator instanceof decorator_prototype_class))
            $this->_decorator = SysLoader::GetDecorator($this);
        return $this->_decorator;
    }
    /**
		шаблонизатор
     */
    public function GetTemplator ()
    {
        return SysLoader::GetTemplator($this, _APP_PATH.$this->GetFolder() . 'templates/');
    }

}